/*
 * @FilePath: \Src\BSP\src\drv_usart.c
 * @Description: 
 * 
 * Copyright (c) 2025 by ${w}, All Rights Reserved. 
 */

#include "main.h"

Usart1_t sUsart1;
Usart0_t sUsart0;

/* MDK下需要重定义fputc函数, printf函数最终会通过调用fputc输出字符串到串口 */
int fputc(int ch, FILE *f)
{
    while(RESET == usart_flag_get(USART0, USART_FLAG_TC));       /* 等待上一个字符发送完成 */
    
    usart_data_transmit(USART0, (uint8_t)ch);                    /* 将要发送的字符 ch 写入到DR寄存器 */  
    return ch;
}

/**
 * @LastEditTime: Do not edit
 * @Description: 
 * @param {uint32_t} baud
 * @return {}
 */
void uasrt0_init(uint32_t baud)
{
    /* 设置时钟 */
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_USART0);

    /* 设置USART0 Tx复用 */
    gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);
    /* 设置USART0 Rx复用 */
    gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_10);

    /* 配置GPIO Tx */
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_9);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
    /* 配置GPIO Rx */
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);

    /* 配置USART */
    /* 复位串口 */
    usart_deinit(USART0);

    /* 配置波特率 */
    usart_baudrate_set(USART0, baud);
    /* 配置停止位 1位 */
    usart_stop_bit_set(USART0, USART_STB_1BIT);
    /* 配置数据长度 8位 */
    usart_word_length_set(USART0, USART_WL_8BIT);
    /* 配置奇偶校验位 无奇偶校验 */
    usart_parity_config(USART0, USART_PM_NONE);
    /* 使能发送 */
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
    /* 使能接收 */
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);
    /* 使能接收缓冲区非空判断 */
    usart_interrupt_enable(USART0, USART_INT_RBNE);
    /* 使能空闲中断 */
    usart_interrupt_enable(USART0, USART_INT_IDLE);
    /* 配置中断优先级 */
    nvic_irq_enable(USART0_IRQn, 1);
    /* 使能串口 */
    usart_enable(USART0);
}

/**
 * @LastEditTime: Do not edit
 * @Description: 
 * @param {uint8_t} *data
 * @return {}
 */
void Usart0_SendData(uint8_t *data)
{
    while (*data != '\0')
    {
        while(RESET == usart_flag_get(USART0, USART_FLAG_TC));       /* 等待上一个字符发送完成 */
        usart_data_transmit(USART0, *data++);
    }
}

/**
 * @LastEditTime: Do not edit
 * @Description: 
 * @param {uint8_t} *data
 * @param {uint16_t} length
 * @return {}
 */
void Usart0_SendPackage(uint8_t *data, uint16_t length)
{
    while (length --)
    {
        while(RESET == usart_flag_get(USART0, USART_FLAG_TC));       /* 等待上一个字符发送完成 */
        usart_data_transmit(USART0, *data++);
    }
}

/**
 * @LastEditTime: Do not edit
 * @Description: 
 * @param {uint32_t} baud
 * @return {}
 */
void uasrt1_init(uint32_t baud)
{
    /* 设置时钟 */
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_USART1);

    /* 设置USART1 Tx复用 */
    // gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_2);
    /* 设置USART1 Rx复用 */
    gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_3);

    /* 配置GPIO Tx */
    // gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2);
    // gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
    /* 配置GPIO Rx */
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3);

    /* 配置USART */
    /* 复位串口 */
    usart_deinit(USART1);

    /* 配置波特率 */
    usart_baudrate_set(USART1, baud);
    /* 配置停止位 1位 */
    usart_stop_bit_set(USART1, USART_STB_1BIT);
    /* 配置数据长度 8位 */
    usart_word_length_set(USART1, USART_WL_8BIT);
    /* 配置奇偶校验位 无奇偶校验 */
    usart_parity_config(USART1, USART_PM_NONE);
    /* 使能发送 */
    usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);
    /* 使能接收 */
    usart_receive_config(USART1, USART_RECEIVE_ENABLE);
    /* 使能接收缓冲区非空判断 */
    usart_interrupt_enable(USART1, USART_INT_RBNE);
    /* 使能空闲中断 */
    usart_interrupt_enable(USART1, USART_INT_IDLE);
    /* 配置中断优先级 */
    nvic_irq_enable(USART1_IRQn, 1);
    /* 使能串口 */
    usart_enable(USART1);
}

/**
 * @LastEditTime: Do not edit
 * @Description: 
 * @param {uint8_t} *data
 * @return {}
 */
void Usart1_SendData(uint8_t *data)
{
    while (*data != '\0')
    {
        while(RESET == usart_flag_get(USART1, USART_FLAG_TC));       /* 等待上一个字符发送完成 */
        usart_data_transmit(USART1, *data++);
    }
}

/**
 * @LastEditTime: Do not edit
 * @Description: 
 * @param {uint8_t} *data
 * @param {uint16_t} length
 * @return {}
 */
void Usart1_SendPackage(uint8_t *data, uint16_t length)
{
    while (length --)
    {
        while(RESET == usart_flag_get(USART1, USART_FLAG_TC));       /* 等待上一个字符发送完成 */
        usart_data_transmit(USART1, *data++);
    }
}

/**
 * @LastEditTime: Do not edit
 * @Description: 
 * @return {}
 */
void USART1_IRQHandler(void)
{
    /* 接收中断 */
    if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE) != RESET)
    {
        if(sUsart1.Length_Rec >= RX_LENTH_MAX)
        {
            sUsart1.Length_Rec = 0;
        }
        sUsart1.RxBuffer[sUsart1.Length_Rec++] = usart_data_receive(USART1);
    }
    else if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_IDLE) != RESET)
    {
        sUsart1.RxBuffer[sUsart1.Length_Rec] = '\0';
        sUsart1.Flag_Rec = true;
        usart_interrupt_flag_clear(USART1, USART_INT_FLAG_IDLE);
    }
}

/**
 * @LastEditTime: Do not edit
 * @Description: 
 * @return {}
 */
void USART0_IRQHandler(void)
{
    /* 接收中断 */
    if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE) != RESET)
    {
        if(sUsart0.Length_Rec >= RX_LENTH_MAX)
        {
            sUsart0.Length_Rec = 0;
        }
        sUsart0.RxBuffer[sUsart0.Length_Rec++] = usart_data_receive(USART0);
    }
    else if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_IDLE) != RESET)
    {
        sUsart0.RxBuffer[sUsart0.Length_Rec] = '\0';
        sUsart0.Flag_Rec = true;
        usart_interrupt_flag_clear(USART0, USART_INT_FLAG_IDLE);
    }
}
